package fio

import (
	"golang.org/x/exp/mmap"
	"os"
)

// MMap 内存文件索引 IO 类型
type MMap struct {
	readerAt *mmap.ReaderAt // 只读
}

// NewMMapIOManager 初始化 MMap IO
func NewMMapIOManager(fileName string) (*MMap, error) {
	fio, err := os.OpenFile(fileName, os.O_CREATE, DataFileMode)
	defer fio.Close()
	if err != nil {
		return nil, err
	}
	readerAt, err := mmap.Open(fileName) // 只打开已存在文件
	if err != nil {
		return nil, err
	}
	return &MMap{readerAt: readerAt}, nil
}

// Read 从文件指定偏移位置读取切片长度大小数据
func (m *MMap) Read(b []byte, offset int64) (int, error) {
	return m.readerAt.ReadAt(b, offset)
}

// Write MMap 只读，不实现 Write
func (m *MMap) Write([]byte) (int, error) {
	panic("not implemented")
}

// Sync MMap 只读，不实现 Sync
func (m *MMap) Sync() error {
	panic("not implemented")
}

// Close 关闭文件
func (m *MMap) Close() error {
	return m.readerAt.Close()
}

// Size 获取文件大小
func (m *MMap) Size() (int64, error) {
	return int64(m.readerAt.Len()), nil
}
